#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtGui>
#include <iostream>

using namespace std;

/*
TODO: alguna indicación de "modificado". El evento isModified o algo así del
plainText no va demasiado bien.
*/

void ERRCHECK(FMOD_RESULT result)
{
	if (result != FMOD_OK)
	{
		cout <<  "ERROR " << FMOD_ErrorString(result) << endl;
		//printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
		exit(-1);
	}
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	// Mensaje de bienvenida, ante todo educación
	ui->statusBar->showMessage("Bienvenido a JCRAM", -1);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/* Slots */

void MainWindow::on_actionSalir_triggered()
{

	comprobar_si_modificado();
	// Salir del programa. ¿Habrá una forma más mejor que esta?
	exit(1);
}

void MainWindow::on_actionAcercade_triggered()
{
	// Mensaje de "Acerca de"
	QMessageBox::about(this, "Acerca de", "JCRAM is awesome");

}

void MainWindow::on_actionNuevo_triggered()
{
	comprobar_si_modificado();
	this->archivo_actual = "";
	if(!ui->plainTextEdit->document()->isEmpty())
		ui->plainTextEdit->setPlainText("");
	ui->plainTextEdit->document()->setModified(false);
}

void MainWindow::on_actionCargar_triggered()
{
	// Abrimos un diálogo para seleccionar un archivo y devuelve la ruta
	QString filename = QFileDialog::getOpenFileName(this, "Abrir script", QDir::homePath(), "*.txt");

	// Si no le ha dado a cancelar
	if(!filename.isEmpty()){
		// Creamos un nuevo fichero QFile
		QFile fichero(filename);
		// Intentamos abrirlo, si algo sale mal, mensaje y a correr
		if(!fichero.open(QFile::ReadOnly | QFile::Text)){
			QMessageBox::warning(this, "Error abriendo el archivo", "Se produjo un error abriendo el archivo");
			}
		else{
			// Guardamos el archivo actual (para guardar luego)
			this->archivo_actual = filename;
			// Creamos un TextStream para obtener QString, QFile devuelve bits
			QTextStream in(&fichero);
			// Cambiamos el contenido del plainTextEdit
			ui->plainTextEdit->setPlainText(in.readAll());
			// Cambiamos el nombre de la ventana
			set_window_title(filename);
		}
	}
}

void MainWindow::on_actionGuardar_triggered()
{
	// Guardamos si ha sido modificado
	if(ui->plainTextEdit->document()->isModified()){
		QString nombre_leido;
		// No tenemos nombre, necesitamos un diálogo
		if(this->archivo_actual.isEmpty()){
			nombre_leido = QFileDialog::getSaveFileName(this, "Guardar como...", QDir::homePath(), "*.txt");
			}

		if(!nombre_leido.isEmpty()){
			this->archivo_actual = nombre_leido;
			// Guardamos el archivo con this->archivo_actual
			guardar_archivo();
		}

		}
}

void MainWindow::on_actionGuardarComo_triggered()
{
	QString nombre_leido;
	nombre_leido = QFileDialog::getSaveFileName(this, "Guardar como...", QDir::homePath(), "*.txt");

	// Comprobamos que no haya pulsado escape / cancelar
	if(!nombre_leido.isEmpty()){
		this->archivo_actual = nombre_leido;
		// Guardamos el archivo con this->archivo_actual
		guardar_archivo();
	}
}

/* Funciones privadas */

void MainWindow::set_window_title(QString nuevo_titulo){
	// Insertamos el título de la aplicación
	nuevo_titulo.insert(0, "JCRAM: ");
	// Cambiamos el caption de la ventana
	this->setWindowTitle(nuevo_titulo);
	}

void MainWindow::comprobar_si_modificado(){

	if(ui->plainTextEdit->document()->isModified()){
		QMessageBox::StandardButton respuesta = QMessageBox::question(this, "Atención", "Desea guardar los cambios?", QMessageBox::No | QMessageBox::Yes, QMessageBox::Yes);

		if(respuesta == QMessageBox::Yes){
			QString nombre_leido;
			// No tenemos nombre, necesitamos un diálogo
			if(this->archivo_actual.isEmpty()){
				nombre_leido = QFileDialog::getSaveFileName(this, "Guardar como...", QDir::homePath(), "*.txt");
				}

			if(!nombre_leido.isEmpty()){
				this->archivo_actual = nombre_leido;
				// Guardamos el archivo con this->archivo_actual
				guardar_archivo();
			}
			}
		}

	}

void MainWindow::guardar_archivo(){

	// Intentamos abrir el fichero actual
	QFile fichero(this->archivo_actual);
	if(!fichero.open(QFile::WriteOnly | QFile::Text)){
		QMessageBox::warning(this, "Error guardando", "Se ha producido un error guardando el archivo");
		}

	// Escribimos
	QTextStream out(&fichero);
	out << ui->plainTextEdit->toPlainText();
	fichero.close();

	// Marcamos como no modificado
	ui->plainTextEdit->document()->setModified(false);
	}


